//1.undefine
function undefineFunc () {
    var a;
    console.log(a); //undefine
    console.log(a == undefined); //true

    let message;
    // let age; 
    //typeof 打印数据类型
    console.log(typeof message); //undefined
    console.log(typeof age); //undefined age没有声明

    if (message) {
        //没有声明不走
        console.log('message 没有声明不走');
    }
    if (!message) {
        //没有声明走
        console.log('message 没有声明走');
    }

    let name = 15;
    if (name) {

        console.log('name 声明 走');
    }
    if (!name) {
        //没有声明走
        console.log('name 声明 不走');
    }


}
undefineFunc();

//2.null类型,对象类型空指针时
function NullFunc () {
    let car = null;
    console.log(typeof (car));  //object,赋值car为null,则默认car为对象类型

    let message = null;
    let age;
    if (message) {
        // 这个块不会执行
    }
    if (!message) {
        // 这个块会执行
    }

}
NullFunc();


//3.布尔类型
function boolFunc () {
    let a = true;
    a = false;
    let b = false;

    //字符串转bool
    let message = 'hello word';
    let messageBool = Boolean(message);
    console.log(messageBool);
}
boolFunc();

//4.number类型
function numberFunc () {
    //浮点型
    let floatNum1 = 1.1;
    let floatNUm2 = 0.1;
    let floatNUm3 = .1; //有效,不推荐

    //浮点数占用内存空间是正式两倍,以下情况会转成整数
    let floatNum4 = 1.; // 小数点后面没有数字，当成整数 1 处理
    let floatNum5 = 10.0; // 小数点后面是零，当成整数 10 处理

    //最大整数值
    let maxResult = Number.maxResult;
    //最大负整数值
    let minResult = Number.minResult;
    console.log(minResult);
    //是否合法数值 isFinite判断是否合法数值
    let result = Number.MAX_VALUE + Number.MAX_VALUE;
    console.log(isFinite(result)); // false


    /*
    有一个特殊的数值叫 NaN，意思是“不是数值”（Not a Number）
    */
    //1.用 0 除任意数值在其他语言中通常都会导致错误，从而中止代码执行
    console.log(0 / 0); // NaN 
    console.log(-0 / +0); // NaN
    //2.如果分子是非 0 值，分母是有符号 0 或无符号 0，则会返回 Infinity 或-Infinity：
    console.log(5 / 0); // Infinity 
    console.log(5 / -0); // -Infinity

    //isNaN 判断是否是数值
    console.log(isNaN(NaN)); // true 
    console.log(isNaN(10)); // false，10 是数值
    console.log(isNaN("10")); // false，可以转换为数值 10 
    console.log(isNaN("blue")); // true，不可以转换为数值
    console.log(isNaN(true)); // false，可以转换为数值 1

    //数值转换
    console.log(Number("Hello world!")); // NaN
    console.log(Number("")); //0
    console.log(Number("000011")); //11
    console.log(Number(true)); //1
    console.log('ddddd');
    console.log(Number(null)); // 0
    console.log(Number(undefined)); //NaN

    //parseInt
    let num1 = parseInt("1234blue"); // 1234 
    let num2 = parseInt(""); // NaN 
    let num3 = parseInt("0xA"); // 10，解释为十六进制整数
    let num4 = parseInt(22.5); // 22 
    let num5 = parseInt("70"); // 70，解释为十进制值
    let num6 = parseInt("0xf"); // 15，解释为十六进制整数

    //parseFloat
    let num11 = parseFloat("1234blue"); // 1234，按整数解析
    let num12 = parseFloat("0xA"); // 0 
    let num13 = parseFloat("22.5"); // 22.5 
    let num14 = parseFloat("22.34.5"); // 22.34 
    let num15 = parseFloat("0908.5"); // 908.5 
    let num16 = parseFloat("3.125e7"); // 31250000

}
numberFunc();


function StringFunc () {

    console.log('---字符串-----');
    //1.特点
    /*
    字符串是不可变的（immutable），意思是一旦创建，它们的值就不能变了。要修改某个变量中的字符串值，必须先销毁原始的字符串，然后将包含新值的另一个字符串保存到该变量
    */
    let lang = "Java";
    lang = lang + "Script";
    console.log(lang);

    //2.类型转换
    let age = 11;
    let ageAsString = age.toString(); // "11" 
    console.log('ageAsString' + ageAsString);
    let found = true;
    let foundAsString = found.toString();
    console.log('foundAsString' + foundAsString); //"true"

    //3.多进制转换
    let num = 10;
    console.log(num.toString()); // "10" 
    console.log(num.toString(2)); // "1010" 
    console.log(num.toString(8)); // "12" 
    console.log(num.toString(10)); // "10" 
    console.log(num.toString(16)); // "a"
    let value1 = 10;
    let value2 = true;
    let value3 = null;
    let value4;
    console.log(String(value1)); // "10" 
    console.log(String(value2)); // "true" 
    console.log(String(value3)); // "null" 
    console.log(String(value4)); // "undefined"

    //4.字符串拼值
    let value = 5;
    let exponent = 'second';
    // 以前，字符串插值是这样实现的：
    let interpolatedString =
        value + ' to the ' + exponent + ' power is ' + (value * value);
    // 现在，可以用模板字面量这样实现：
    let interpolatedTemplateLiteral =
        `${value} to the ${exponent} power is ${value * value}`;
    console.log(interpolatedString); // 5 to the second power is 25 
    console.log(interpolatedTemplateLiteral); // 5 to the second power is 25

}
StringFunc()


//5.Symbol类型.没看懂

console.log('___对象类型___');

//6.object类型
function objectFunc () {
    //创建对象
    let person = Object();
    person.name = "xing";
    person.age = 15;
    console.log(person);
}

objectFunc()